ECS 踏み台
ECS Fargateを踏み台にポートフォワードしてVPC内のRDSに接続する
メンテが楽になるサーバレス踏み台のススメ(AWS Fargate + SSMポートフォワーディング) | DCS blog
これは少し情報が古い。今はリモートポートフォワードが可能なので、ECS でポートフォワードの設定をする必要はない
SSM を使う
ECS は、 ecs exec を実行できる準備が必要
ecs exec とは ecs のコンテナに直接アクセスできる仕組みのこと
Monitor Amazon ECS containers with ECS Exec - Amazon Elastic Container Service
You must use a task role with the appropriate permissions for ECS Exec
ecs の security group に inbound rule は不要
ecs task が private subnet にある場合は、、、
AWS ECS Execを活用しよう!設定時の注意点と実践ガイド
nat とうで、ecs からインターネットへのアクセスが必要
起動時に、ecs コンテナないのエージェントが、nat を通じて ssm のインスタンス?に接続できる必要があるみたい
ここで通信経路をあらかじめ確保しておく
aws ssm start-session コマンドを叩くと、この経路が使われる、という感じみたい
role を作る
ecs exec に必要な権限
https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-iam-roles.html#ecs-exec-required-iam-permissions
AWS CLI create-role
ecs task role の作り方
Amazon ECS task IAM role - Amazon Elastic Container Service
code:shell
ACCOUNT_ID=$(aws sts get-caller-identity --query 'Account' --output text)
REGION=$(aws configure get region)
// cloud shell なら $AWS_REGION
POLICY=$(cat <<EOF
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": { "Service": "ecs-tasks.amazonaws.com" },
"Action": "sts:AssumeRole",
"Condition": {
"ArnLike": { "aws:SourceArn": "arn:aws:ecs:${REGION}:${ACCOUNT_ID}:*" },
"StringEquals": { "aws:SourceAccount": "${ACCOUNT_ID}" }
}
}
]
}
EOF
)
aws iam create-role \
--role-name bastionEcsTaskRole \
--assume-role-policy-document "$POLICY"
ecs exec が実行できるポリシーを role につける
code:shell
############# 0) 変数セット #############
ACCOUNT_ID=$(aws sts get-caller-identity --query 'Account' --output text)
############# 1) ポリシー JSON を変数へ #############
SSM_POLICY=$(cat <<'JSON'
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ssmmessages:CreateControlChannel",
"ssmmessages:CreateDataChannel",
"ssmmessages:OpenControlChannel",
"ssmmessages:OpenDataChannel"
],
"Resource": "*"
}
]
}
JSON
)
############# 2) カスタマー管理ポリシーを作成 #############
# すでに同名ポリシーがあるとエラーになるので注意
POLICY_ARN=$(aws iam create-policy \
--policy-name bastionEcsExecSsmPolicy \
--policy-document "$SSM_POLICY" \
--query 'Policy.Arn' --output text) # ← ARN を即取得
echo "Created policy: $POLICY_ARN"
############# 3) 役割にポリシーをアタッチ #############
aws iam attach-role-policy \
--role-name bastionEcsTaskRole \
--policy-arn "$POLICY_ARN"
その role を task definition で使う
接続テスト
code:shell
aws ssm start-session \
--target ecs:CONTAINER_TASKID_RUNTIMEID